import { BaseStorage } from '@2/app/core/storage/base.storage';
import { ThemeEnum } from '@/enums/appEnum';
import { MenuSetting, ProjectConfig } from '#/config';
import { StateTree } from 'pinia';
import { BeforeMiniState } from '#/store';

/**
 * @program: microservice-central-portal
 * @description: 系统状态定义存储接口，用于当前应用状态存储，具体使用 {@see AppStorageImpl}，包含获取暗黑模式主题、设置暗黑模式主题或其他主题、设置项目配置、设置分页加载状态、获取当前应用项目配置等方法定义，方便统一管理和维护状态信息
 * @author: baiHoo.chen
 * @create: 2022年5月26日
 **/
export interface AppStorage extends BaseStorage<AppState> {
  /**
   * 默认获取暗黑模式主题
   */
  getDarkMode(): 'light' | 'dark' | string;

  /**
   * 设置暗黑模式主题或其他主题 {@see ThemeEnum}
   * @param mode 暗黑模式主题或其他主题
   */
  setDarkMode(mode: ThemeEnum): void;
  /**
   * 设置项目配置
   * @param config 项目配置
   */
  setProjectConfig(config: DeepPartial<ProjectConfig>): void;
  /**
   * 获取当前应用项目缩小时的配置，记住一些状态，并在恢复窗口时恢复这些状态
   */
  getBeforeMiniInfo(): BeforeMiniState;
  /**
   * 设置分页加载状态
   * @param loading 分页加载状态
   */
  setPageLoadingAction(loading: boolean): Promise<void>;
  /**
   * 获取当前应用项目配置
   */
  getProjectConfig(): ProjectConfig;
  /**
   * 设置当前应用项目缩小时的配置，记住一些状态，并在恢复窗口时恢复这些状态
   * @param state
   */
  setBeforeMiniInfo(state: BeforeMiniState): void;

  /**
   * 获取分页加载状态
   */
  getPageLoading(): boolean;

  /**
   * 设置分页加载状态
   * @param loading
   */
  setPageLoading(loading: boolean): void;

  /**
   * 获取菜单设置
   */
  getMenuSetting(): MenuSetting;

  /**
   * 设置菜单
   * @param setting
   */
  setMenuSetting(setting: Partial<MenuSetting>): void;
}
/**
 * @program: microservice-central-portal
 * @description: 系统应用存储状态设置，具体使用 {@see AppStorageImpl}
 * @author: baiHoo.chen
 * @create: 2022年5月29日
 **/
export interface AppState extends StateTree {
  // 系统暗亮色主题
  darkMode?: ThemeEnum;
  // 是否分页加载
  pageLoading: boolean;
  // 项目配置
  projectConfig: ProjectConfig | null;
  // 当窗口缩小时，记住一些状态，并在恢复窗口时恢复这些状态
  beforeMiniInfo: BeforeMiniState;
}
